//
//  StatusPictureView.swift
//  个人微博
//
//  Created by 一介布衣 on 16/2/23.
//  Copyright © 2016年 HUAMANLOU. All rights reserved.
//

import UIKit

/*
单图会按照图片等比例显示
多图的图片大小固定
多图如果是4张，会按照 2 * 2 显示
多图其他数量，按照 n * 3 九宫格显示
*/

class StatusPictureView: UICollectionView {

    private let pictureCellId = "pictureCellId"
    let itemWidth = (screenWidth - statusCellMargin * 2 - 2 * pictureCellMargin)/3
    
    // 配图视图的数据源数组
    var imageURLs: [NSURL]? {
        didSet {
            let pSize = calculatePictureViewSize()
            // 之前给它设置了默认的大小，所以要更新配图视图的大小
            self.snp_updateConstraints { (make) -> Void in
                make.size.equalTo(pSize)
            }
            
            // 更新测试label的文案
            testLabel.text = "\(imageURLs?.count ?? 0)"
            
            // 刷新视图，只要tableView或者collectionView的数据源发生了更改，就需要调用刷新
            reloadData()
        }
    }
    
    
    override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) {
        // 实例化流水布局
        let flowLayout = UICollectionViewFlowLayout()
        // 设置layout
        flowLayout.itemSize = CGSizeMake(itemWidth, itemWidth)
        // 设置最小间距
        flowLayout.minimumInteritemSpacing = pictureCellMargin
        flowLayout.minimumLineSpacing = pictureCellMargin
        
        super.init(frame: CGRectZero, collectionViewLayout: flowLayout)
    
        self.backgroundColor = UIColor.whiteColor()
        
        // 添加测试label
        self.addSubview(testLabel)
        testLabel.snp_makeConstraints { (make) -> Void in
            make.center.equalTo(self.snp_center)
        }
        
        // 设置数据源
        self.dataSource = self
        
        // 此处必须关闭，因为tableView的scrollsToTop属性也是开启的，
        // scrollsToTop只有一个开启才有效（点击手机的状态栏让页面快速回到顶部）
        self.scrollsToTop = false
        // 注册cell
        self.registerClass(PictureCell.self, forCellWithReuseIdentifier: pictureCellId)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    
    
    
    // 1.根据配图视图的数量，来计算配图视图的真实大小
    private func calculatePictureViewSize()->(CGSize) {
    
        let imageCount = imageURLs?.count ?? 0
        if imageCount == 0 {
            return CGSizeZero
        }
        
        // 获取流水布局对象
        let flowLayout = collectionViewLayout as! UICollectionViewFlowLayout
        if imageCount == 1 {
            // TODO: 后期完善
            let imageSize = CGSize(width: 150, height: 200)
            // 需要设置itemSize和图片大小一致
            flowLayout.itemSize = imageSize
            return imageSize
        }
        
        // 如果不是单张图片，需要重新设置collectionView的cell的大小，
        // 防止cell复用的时候显示出问题
        flowLayout.itemSize = CGSize(width: itemWidth, height: itemWidth)
        if imageCount == 4 {
            let w = itemWidth * 2 + pictureCellMargin
            return CGSize(width: w, height: w)
        }

        // 多张图片
        /*
        1,2,3   -> 1
        4,5,6   -> 2
        7,8,9   -> 3
        */
        let row = CGFloat((imageCount - 1)/3 + 1)
        let w = itemWidth * 3 + pictureCellMargin * 2
        let h = itemWidth * row + (row - 1) * pictureCellMargin
        return CGSize(width: w, height: h)
    }
    
    private lazy var testLabel:UILabel = UILabel(text: "", fontSize: 40, textColor: UIColor.redColor())
}




// UIcollectionView的数据源方法
extension StatusPictureView: UICollectionViewDataSource {
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return imageURLs?.count ?? 0
    }


    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(pictureCellId, forIndexPath: indexPath) as! PictureCell
        
        // 设置调试颜色
//        cell.backgroundColor = indexPath.item%2 == 0 ? UIColor.redColor():UIColor.whiteColor()
        cell.imageURL = imageURLs![indexPath.item]
        
        return cell
    }
}



// 类之间关系很密切，并且没有太多复杂的逻辑时，是可以写在同一个文件中
private class PictureCell: UICollectionViewCell {

    // 外部设置的图片url属性
    var imageURL: NSURL? {
        didSet {
            iconView.sd_setImageWithURL(imageURL)
        }
    }
    // 懒加载视图
    private lazy var iconView: UIImageView = {
        let iv = UIImageView()
        // UIImageView默认的显示方式是ScaleToFill：缩放全部视图进行填充
        // ScaleAspectFill：部分，缩放部分进行填充，视图的比例不会失帧，但是图片会被裁减
        iv.contentMode = .ScaleAspectFill
        
        // ScaleAspectFit：部分图片进行适应的显示，会导致imageView可能会留白，
        // 一般也不推荐使用这种方式来显示图片
//        iv.contentMode = .ScaleAspectFit
        
        // 手动设置裁减
        iv.clipsToBounds = true
    
        return iv
    }()
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.backgroundColor = UIColor(white: 0.95, alpha: 1)
        setupUI()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    // 设置界面
    private func setupUI() {
        contentView.addSubview(iconView)
        
        iconView.snp_makeConstraints { (make) -> Void in
            make.edges.equalTo(contentView.snp_edges)
        }
    }
}



